#!/usr/bin/perl
use Switch;

############################Declaracion de Variables Globales############################
$grabar = " ";
%reg_cliente = ({'CUSTOMER_ID'} => {'TERRITORY','CUSTOMER_1ST_NAME','CUSTOMER_2ND_NAME','DOC_NUMBER','DOC_TYPE','CUSTOMER_ADDR'});
%reg_sucursal = ({'BRANCH_ID'} => {'REGION_ID','REGION_NAME','BRANCH_NAME','BRANCH_ADDR','BRANCH_PHONE','START_DATE','END_DATE'});
%reg_productos = {'PRODUCT_TYPE_ID','PRODUCT_TYPE_NAME','COMMERCIAL_PLAN_ID','COMMERCIAL_PLAN_NAME','CLASS_SERVICE_ID','CLASS_SERVICE_NAME','CLASS_SERVICE_IS_REQUIRED','ITEM_ID','ITEM_NAME' };
@AOH_resultado = ({'BRANCH_ID_RTO','BRANCH_NAME_RTO','CUSTOMER_ID_RTO','CUSTOMER_1ST_NAME_RTO','PRODUCT_TYPE_NAME_RTO','COMMERCIAL_PLAN_NAME_RTO','ITEM_NAME_RTO'});
@AOH_resultado_Ordenado = ({'BRANCH_ID_RTO','BRANCH_NAME_RTO','CUSTOMER_ID_RTO','CUSTOMER_1ST_NAME_RTO','PRODUCT_TYPE_NAME_RTO','COMMERCIAL_PLAN_NAME_RTO','ITEM_NAME_RTO'});
@vector_cliente;
@vector_producto;
@vector_sucursales;
$encontrado = "N";
$item_a_buscar = " ";
####################################################################################


############################SUBRUTINAS############################################
sub chk_parametro_entrada
{
	#Vemos el parametro para si la consulta se debe grabar.
	#========================================
	
	if(scalar(@ARGV) < 2){
		$parametros = $ARGV[0];
	}else{
		print "Se han ingresado mas parametros de lo permitido por favor lea el help (ListarU.pl -h) para mas ayuda \n";
		exit 0;
	}
 	switch ($parametros){
		case "-c" {
			#Resuelve la consulta y no graba en archivo.
			$grabar = "N";
		}
		case "-e" {
			#Resuelve la consulta y graba en archivo.
			$grabar = "Y";
		}
		else{
			#Esta es la ayuda del comando.
			print "Parametros del comando: \n" ;
			print "===================== \n" ;
			print "-c Resuelve la consulta y muestra resultados no graba en archivo. \n" ;
			print "-e Resuelve la consulta y graba un Reporte. \n" ;
			print "-h Muestra la ayuda del comando. \n" ;
			print "\n";
			print "Parametros de la consulta \n";
			print "======================== \n" ;
			print "Para poder seleccionar todos los posibles valores para un campo debe usar el caracter * (asterisco) \n" ;
			print "Para selecionar mas de un Tipo de Producto o mas de un Cliente ultilice el simbolo + (ej:XXX+YYY) \n";
			print "Para seleccionar un rango de Sucursales ultilice el simbolo -. Indicando el primer valor del rango (menor) y el ultimo valor (mayor) \n";
			exit 0;
		}
	}
};

sub ingrese_datos_consulta
{
	print "=================================== \n";
	print "= Ingrese los datos para consulta = \n" ;
	print "=================================== \n";
	print " \n \n";
	#Pedimos los valores para la consulta ID Sucursal, ID Cliente, Descripcion del Item de Prod del Registro Cabacera.
	#===================================================================================

	#Empezamos a cargar la consulta de Tipo de Producto.
	print "Ingresamos los Tipos de Productos \n";
	print "================================= \n";
	do {
		print "NOTA: Si desea pasar todos los Tipo de Productos ingrese * (asterisco). \n";
		print " \n";
		print "Ingrese cuantos Tipo de Productos desea ingresar: "; $cantidad_pro = <STDIN>; chop($cantidad_pro);

		#Validamos que la cantidad de productos sea un numero
		if($cantidad_pro =~ m/[1-9]/)
		{

			for($i=0; $i < $cantidad_pro; $i++)
			{
			
				#Pedimos los tipo de producto y validamos que sean caractares.
				print  "	Tipo de Producto $i: " ; $Tipo_Pro = uc(<STDIN>);chop( $Tipo_Pro );
				while( $Tipo_Pro !~ m/[A-Z]/i )
				{
			
					print "Usted ha ingresado un Tipo de Producto Incorrecto. Por favor intente nuevamente \n";
					print  "	Tipo de Producto $i: " ; $Tipo_Pro = uc(<STDIN>);chop( $Tipo_Pro );

				};
				
				#Agregamos el nombre del Tipo de producto al Vector de Producto
				push(@vector_producto,$Tipo_Pro);
			
			};

		}elsif($cantidad_pro eq "*")
			{

				#Si ingresamos asterisco tenemos que tomar todos los productos que se encuentran en el directorio parque instalado.
				$GRUPO = $ENV{'GRUPO'};
				$dir="$GRUPO"."/parque_instalado/";
				if (opendir(DIRH,"$dir"))
				{
					#Guardamos todos los archivos del directorio en el array.
					@flist=readdir(DIRH);
					closedir(DIRH);
				}
				#Recorremos el array y nos quedamos con los archivos que tienen permiso de lectura (requisito para que se procese).
				#ignoramos el . y .. y los vamos agregando al vector de Productos.
				foreach (@flist)
				{
					next if ($_ eq "." || $_ eq "..");
					if ( -r "$dir/$_" )
					{
						push(@vector_producto,$_);
					}
				}
			}else{
			
				print "Se ha ingresado una cantidad de productos no valida! Por favor intente nuevamente \n";
				$cantidad_pro = " ";
			
			}
	 }while ( $cantidad_pro =~ /\s/ );
	
	
	#Empezamos a cargar la consulta de sucursales.
	print "\n";
	print "Ingresamos los datos de Sucursales \n";
	print "================================== \n";	
	do {	
		print "NOTA: Para pasar un rango utilizar el - (guion) indicando la primer y la ultima sucursal a consultar ej: 001-019 \n";
		print "	Si desea pasar todas las Sucursales ingrese * (asterisco). \n";
		print " \n";
		print  '	ID de Sucursal :  ' ; $ID_Suc = <STDIN> ; chomp( $ID_Suc );
		
		#Lo primero que validamos es si lo que nos pasa es un rango.
		if ($ID_Suc =~ m/-/i)
		{

			#si pone una terna de rangos solo toma la primera dupla.
			($desde, $hasta) = split("-",$ID_Suc);
			
			#Validamos que el rango ingresado sea correcto. Sea un numero y que el fin del rango sea mayor al inicio.
			if ( $desde !~ m/[0-9]{1,3}/i  or $hasta !~ m/[0-9]{1,3}/i or $hasta < $desde) 
			{

				print "Usted ha ingresado un rango de Sucursales incorrecto \n";
				$ID_Suc = " ";

			}else{

				#Agregamos las sucursales al vector de sucursales.
				push(@vector_sucursales,$desde);push(@vector_sucursales,$hasta);
			
			}
		} elsif($ID_Suc eq "*"){
				
				#Si es asterisco ponemos cargamos un asterisco para que muestre todas las sucursales.
				push(@vector_sucursales, $ID_Suc);
				
			}elsif ( $ID_Suc !~ m/[0-9]/i)
				{
					
					print "Usted ha ingresado un ID de Sucursal incorrecto \n";
					$ID_Suc = " ";
				
				}else{
				
					#Agregamos las sucursales al vector de sucursales.
					push(@vector_sucursales, $ID_Suc);
			
				}

	} while ( $ID_Suc =~ /\s+/);
	
	
	#Empezamos a cargar la consulta de Clientes.
	print "\n";
	print "Ingresamos los datos de Clientes \n";
	print "=============================== \n";
	do {

		print "NOTA:  Si desea pasar todos los Clientes ingrese * (asterisco). \n";
		print " \n";
		print "	Ingrese la cantidad de Clientes que desea ingresar: "; $cantidad_cli = <STDIN>; chop($cantidad_cli);
		
		#Validamos si la cantidad de clientes sea un numero.
		if($cantidad_cli =~ /[0-9]/)
		{
			for($i=0; $i < $cantidad_cli; $i++)
			{

				#Pedimos los clientes y validamos que sean numeros.
				print  "	ID de Cliente $i=  " ; $ID_Cli = <STDIN> ; chop( $ID_Cli );
				while ( $ID_Cli !~ m/[0-9]/i )
				{
			
					print "Usted ha ingresado un Tipo de Producto Incorrecto. Por favor intente nuevamente \n";
					print  "	ID de Cliente $i=  " ; $ID_Cli = <STDIN> ; chop( $ID_Cli );

				};
				
				#Agregamos al vector de clientes.
				push(@vector_cliente,$ID_Cli);
			
			};
			
		}elsif($cantidad_cli eq "*")
			{
				
				#Agrego un asterisco al vector de cliente
				push(@vector_cliente,$cantidad_cli);
			
			}else{
			
				print "Se ha ingresado una cantidad de productos no valida! \n";
				$cantidad_cli = " ";
			
			}
	} while ( $cantidad_cli =~ /\s+/);
	
	print "\n";
	print "Desea realizar una busqueda por descripcion de Item?  (s/n)";
	$decision = uc(<STDIN>); chop($decision);
	if ($decision eq "S")
	{
		#Empezamos a cargar la consulta de Tipo de Producto.
		print "Busqueda por Descripcion del Item del Prod de Registro Cabecera \n";
		print "=============================================================== \n";
		print "		Ingrese la palabra a buscar: ";
		$item_a_buscar = <STDIN>;chop($item_a_buscar);
	}
};

sub cargar_hash_maestro
{
#Declaramos los Hash de maestros
#=========================

#Guardo en un Hash el Maestro de Clientes
	
	$dir= $ENV{'MAEDIR'}; 
	
	open ($MAECLI,"<$dir/cli.mae") || die "ERROR: No puedo abrir el fichero $clientes \n";
	while ($linea=<$MAECLI>)
	{
		($id_cli , $ciudad_cli , $nombre_cli , $apellidoCli , $dni_cli , $tipo_cli , $direccion_cli) = split( ";", $linea);
		
		$reg_cliente->{ $id_cli }->{ 'TERRITORY' } = $ciudad_cli;
		$reg_cliente->{ $id_cli }->{ 'CUSTOMER_1ST_NAME' } = $nombre_cli;
		$reg_cliente->{ $id_cli }->{ 'CUSTOMER_2ND_NAME' } = $apellidoCli;
		$reg_cliente->{ $id_cli }->{ 'DOC_NUMBER' } = $dni_cli;
		$reg_cliente->{ $id_cli }->{ 'DOC_TYPE' } = $tipo_cli;
		$reg_cliente->{ $id_cli }->{ 'CUSTOMER_ADDR' } = $direccion_cli;
				
#		print "Registro:" . $reg_cliente->{ $id_cli }->{'CUSTOMER_1ST_NAME'} . "\n";
	};
	close ($MAECLI);

#Guardo en un Hash el Maestro de Sucursales.
	open (MAESUC,"<$dir/sucu.mae") || die "ERROR: No puedo abrir el fichero $sucursales \n";
	while ($linea2=<MAESUC>)
	{
		($reg_suc , $regNom_suc , $id_suc , $nombre_suc , $direcion_suc , $tel_suc , $fechaIni_suc , $fechaFin_suc) = split( ",",$linea2);

		$reg_sucursal->{$id_suc}->{'REGION_ID'} = $reg_suc;
		$reg_sucursal->{$id_suc}->{'REGION_NAME'} = $regNom_suc;
		$reg_sucursal->{$id_suc}->{'BRANCH_NAME'} = $nombre_suc;
		$reg_sucursal->{$id_suc}->{'BRANCH_ADDR'} = $direcion_suc;
		$reg_sucursal->{$id_suc}->{'BRANCH_PHONE'} = $tel_suc;
		$reg_sucursal->{$id_suc}->{'START_DATE'} = $fechaIni_suc;
		$reg_sucursal->{$id_suc}->{'END_DATE'} = $fechaFin_suc;
		
#		print "Registro:" . $reg_sucursal->{ $id_suc }->{'BRANCH_NAME'} . "\n";
	};
	close (MAESUC);
	
#Guardo en un Hash el Maestro de Productos.
	open (MAEPRO,"<$dir/prod.mae") || die "ERROR: No puedo abrir el fichero $productos \n";
	while ($linea3=<MAEPRO>)
	{
		($id_tipo_pro , $tipo_pro , $id_comercial_pro , $comercial_nombre_pro , $id_clase_servicio_pro , $tel_pro , $clase_nombre_pro , $es_requerido_pro , $id_item_pro , $item_nombre_pro) = split( ",",$linea3);
		$reg_productos->{'PRODUCT_TYPE_ID'} = $id_tipo_pro; 
		$reg_productos->{'PRODUCT_TYPE_NAME'} = $tipo_pro;
		$reg_productos->{'COMMERCIAL_PLAN_ID'} = $id_comercial_pro;
		$reg_productos->{'COMMERCIAL_PLAN_NAME'} = $comercial_nombre_pro; 
		$reg_productos->{'CLASS_SERVICE_ID'} = $id_clase_servicio_pro;
		$reg_productos->{'CLASS_SERVICE_NAME'} = $clase_nombre_pro;
		$reg_productos->{'CLASS_SERVICE_IS_REQUIRED'} = $es_requerido_pro;
		$reg_productos->{'ITEM_ID'}  = $id_item_pro;
		$reg_productos->{'ITEM_NAME'} = $item_nombre_pro;
		push(@cantidad_productos, %reg_productos);
#		print "Registro:" .$reg_productos->{'PRODUCT_TYPE_ID'} ."\n";
	};
	close (MAEPRO);
};

sub resolver_consulta
{
	$long_producto = scalar(@vector_producto);
	$long_sucursales = scalar(@vector_sucursales);
	$long_clientes = scalar(@vector_cliente);
	
	printf "°°°°°°°°°°°°°°°°°°°$long_clientes \n";
	for ($j=0; $j<$long_producto; $j++)
	{
		$dir = $ENV{'GRUPO'};
		$PATH_PRODUCTO = "$dir"."/parque_instalado/"."$vector_producto[$j]";
		open(PARINST,"$PATH_PRODUCTO") || die "ERROR: No existe Parque Instalado $vector_producto[$j] \n";
		while($fila=<PARINST>)
		{
			#Guardamos el nombre del producto en un temporal
			$temp_vector_producto=$vector_producto[$j];
			
			#tenemos los datos del registro de los archivos de Parque instalado.
			($sucursal_id,$cliente_id,$reg_cabecera,$reg_detalle) = split(",",$fila);
			
			#Si las longitudes de los arrays son mayores a 1 significa que tenemos rangos de datos y no un asterisco o consulta especifica.
			if ($long_clientes > 1 and $long_sucursales >1)
			{
				#print "longitudes >1 \n";
				#Verificamos que el cliente de la consulta coincida con el cliente del registro
				for ($l=0;$l <= $long_clientes ;$l++)
				{
				if( $cliente_id eq $vector_cliente[$l]){
					
					#Verificamos que la sucursal del registro este dentro de la consulta.
					for($m=$vector_sucursales[0];$m<$vector_sucursales[1];$m++)
					{
						#Si $m(valor de la sucursal) coincide con el registro que estamos leyendo.
						if($m eq $sucursal_id)
						{
							&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
							$encontrado = "Y";
						}
					
					}
				}
				}
				
			}elsif ($long_clientes >1 and $long_sucursales = 1)
				{
					#print "longitud cliente >1 \n";
					#verificamos que sucursales sea un asterisco
					if($vector_sucursales[0] eq "*")
					{
						#Si lo es solo verificamos que el cliente del registro este en lo que cargamos en la consulta.
						for ($l=0;$l <= $long_clientes ;$l++)
						{
							if( $vector_cliente[$l] eq $cliente_id)
							{
								&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
								$encontrado = "Y";
							}
						}
						#si no es un asterisco chequeamos que los datos de la consulta coincidan con el del registro.
					}else{
						for ($l=0;$l <= $long_clientes ;$l++)
						{
						if($vector_sucursales[0] eq $sucursal_id and ($cliente_id eq $vector_cliente[$l]))
						{	
							&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
								$encontrado = "Y";
						}
						}
					}
							
				}elsif ($long_clientes = 1 and $long_sucursales > 1)
					{
						#print "longitud sucursal >1 \n";
						#Verificamos que el vector cliente tenga un asterisco.
						if($vector_cliente[0] eq "*")
						{
							#Verificamos que la sucursal del registro este dentro de la consulta.
							for($m=$vector_sucursales[0]; $m < $vector_sucursales[1]; $m++)
							{
								#Comparamos el valor de la consulta con el del registro
								if($m eq $sucursal_id)
								{
									&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
									$encontrado = "Y";
								};
					
							}
						}else{
							#SI no es un asterisco chequeamos que el cliente cargado en la consulta coincida con el del registro.
							for ($l=0;$l <= $long_clientes ;$l++)
							{
							if( $cliente_id eq $vector_cliente[$l])
							{
								#Y buscamos si la sucursal del registro este dentro de la consulta de sucursales.
								for($m=$vector_sucursales[0];$m<$vector_sucursales[1];$m++)
								{
									#Si esta en el vector, guardamos la consulta.
									if($m eq $sucursal_id)
									{
										&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
										$encontrado = "Y";
									}
								}
							}
							}
						}
					}elsif($long_clientes = 1 and $long_sucursales = 1)
					      {
							#print "llegue a que son las long 1 \n";
							#Este es el caso en el que tengamos dos asteriscos en la consulta.
							if($vector_cliente[0] eq "*" and $vector_sucursales[0] eq "*")
							{
								#print "tenemos asteriscos \n";
								&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
								$encontrado = "Y";
							
							}elsif($vector_cliente[0] eq "*")
								{
									if($vector_sucursales[0] eq $sucursal_id)
									{
										&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
										$encontrado = "Y";
									}
								}elsif($vector_sucursales[0] eq "*")
								      {
										if($vector_cliente[0] eq $cliente_id)
										{
											&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
											$encontrado = "Y";
										}
								      }else{
										#print "cliente y sucursal especifica \n";
										#Solo consultamos con un cliente y una sucursal especifica.
										#for ($l=0;$l <= $long_clientes ;$l++)
										#{
										
										if($vector_sucursales[0] eq $sucursal_id and ($cliente_id eq $vector_cliente[0]))
										{	
											&guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera);
											$encontrado = "Y";
										}else{
											#print "No hay coincidencia \n";
											$encontrado="N"
										}
										#}
									}
						}
		}
		close(PARINST);
		print " Se termino de procesar el Tipo de Producto $vector_producto[$j] \n";
	}
}

sub guardar_resultados_consulta($cliente_id,$sucursal_id,$temp_vector_producto,$reg_detalle,$reg_cabecera)
{
	if($item_a_buscar eq " ")
	{
		push @AOH_resultado,	{BRANCH_ID_RTO => $sucursal_id,	BRANCH_NAME_RTO => $reg_sucursal->{$sucursal_id}->{'BRANCH_NAME'}, CUSTOMER_ID_RTO => $cliente_id, CUSTOMER_1ST_NAME_RTO => $reg_cliente->{$cliente_id}->{'CUSTOMER_1ST_NAME'},	PRODUCT_TYPE_NAME_RTO => $temp_vector_producto, COMMERCIAL_PLAN_NAME_RTO => $reg_cabecera, ITEM_NAME_RTO => $reg_detalle};
	}else{
		if($reg_detalle =~ m/$item_a_buscar/i)
		{
			push @AOH_resultado,	{BRANCH_ID_RTO => $sucursal_id,	BRANCH_NAME_RTO => $reg_sucursal->{$sucursal_id}->{'BRANCH_NAME'}, CUSTOMER_ID_RTO => $cliente_id, CUSTOMER_1ST_NAME_RTO => $reg_cliente->{$cliente_id}->{'CUSTOMER_1ST_NAME'},	PRODUCT_TYPE_NAME_RTO => $temp_vector_producto, COMMERCIAL_PLAN_NAME_RTO => $reg_cabecera, ITEM_NAME_RTO => $reg_detalle};
		}
	}
}

sub imprimir_encabezado($grabar)
{
	$long_c = scalar(@vector_cliente);
	$long_p = scalar(@vector_producto);
	$long_s = scalar(@vector_sucursales);

	if($grabar eq "N")
	{

		print "\n";
		print "######################## \n";
		print "# Datos de la consulta # \n";
		print "######################## \n";
		
		print "Tipo de Producto: ";
		for($l=0; $l < $long_p; $l++)
		{
			print $vector_producto[$l] . " ";
		}
		print "\n";
		print "Sucursal: ";
		for($l=0; $l < $long_s; $l++)
		{
			print $vector_sucursales[$l] . " ";
		}
		print "\n";
		print "Cliente: ";
		for($l=0; $l < $long_c; $l++)
		{
			print $vector_cliente[$l] . " ";
		}
		print "\n";
		print "Busqueda por Item: "; print $item_a_buscar . "\n";
		print "\n";

	}else{
		print "\n";
		print REPORTE "######################## \n";
		print REPORTE "# Datos de la consulta # \n";
		print REPORTE "######################## \n";
		
		print REPORTE "Tipo de Producto: ";
		for($l=0; $l < $long_p; $l++)
		{
			print REPORTE $vector_producto[$l] . " ";
		}
		print REPORTE "\n";
		print REPORTE "Sucursal: ";
		for($l=0; $l < $long_s; $l++)
		{
			print REPORTE $vector_sucursales[$l] . " ";
		}
		print REPORTE "\n";
		print REPORTE "Cliente: ";
		for($l=0; $l < $long_c; $l++)
		{
			print REPORTE $vector_cliente[$l] . " ";
		}	
		print "\n";
		print REPORTE "Busqueda por Item: "; print REPORTE $item_a_buscar . "\n";
		print "\n";

	}
}

sub mostrar_resultados($grabar)
{
	$total_de_clientes=0;
	$subtotal_cliente_x_suc=0;
	system("clear");
	print "\n";
	print "---------------------------------\n";
	print "RESULTADO DE LA CONSULTA RELIZADA \n";
	print "---------------------------------\n";
	
	#Ordenamos el AOH por Sucursal y Cliente
	@AOH_resultado_Ordenado = sort {$a->{BRANCH_ID_RTO} <=> $b->{BRANCH_ID_RTO}  || $a->{CUSTOMER_ID_RTO} <=> $b->{CUSTOMER_ID_RTO} } @AOH_resultado;
	
	$aux_branch_id_rto=$AOH_resultado_Ordenado[1]{BRANCH_ID_RTO};

	
	print "\n";
	
	if($grabar eq "N")
	{
		&imprimir_encabezado($grabar);

		print " ######################################################## \n";
		for $i (1 .. $#AOH_resultado_Ordenado)
		{
			if($aux_branch_id_rto eq $AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO})
			{
				$subtotal_cliente_x_suc++;
			}else{
				print "		Subtotal $AOH_resultado_Ordenado[($i-1)]{BRANCH_NAME_RTO} :  $subtotal_cliente_x_suc \n";
				print " ######################################################## \n";
				$total_de_clientes = $total_de_clientes + $subtotal_cliente_x_suc;
				$subtotal_cliente_x_suc=1;
				$aux_branch_id_rto=$AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO};
			}

			print " \n";
			print " Sucursal : $AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO} - $AOH_resultado_Ordenado[$i]{BRANCH_NAME_RTO}  \n" ;
			print " Cliente : $AOH_resultado_Ordenado[$i]{CUSTOMER_ID_RTO} - $AOH_resultado_Ordenado[$i]{CUSTOMER_1ST_NAME_RTO} \n";
			print " Tipo de Producto : $AOH_resultado_Ordenado[$i]{PRODUCT_TYPE_NAME_RTO}  \n";
			print " Plan Comercial : $AOH_resultado_Ordenado[$i]{COMMERCIAL_PLAN_NAME_RTO}  \n";
			print " Item :  $AOH_resultado_Ordenado[$i]{ITEM_NAME_RTO}  \n"; 
			print " ######################################################## \n";
			
		}
		print "		Subtotal $AOH_resultado_Ordenado[$#AOH_resultado_Ordenado]{BRANCH_NAME_RTO} :  $subtotal_cliente_x_suc \n";
		$total_de_clientes = $total_de_clientes + $subtotal_cliente_x_suc;
		print " ######################################################## \n";
		print "	#	Total de Clientes: $total_de_clientes          # \n";
		print " ######################################################## \n";
	}else{
		#armamos el nombre del archivo de reporte
		($sec,$min,$hora,$mdia,$mes,$anio,$wdia,$ydia,$isdst)=localtime;
		$anio+=1900;
		$mes++;
		$reporte="lpi.".$mdia.$mes.$anio."-".$hora.$min.$sec;
		
		#armamos el path donde guardamos los reportes
		$dir= $ENV{'REPODIR'};
		
		#Generamos el archivo del reporte
		open (REPORTE,">$dir/$reporte") || die "ERROR: No puedo abrir el archivo \n";
		
		&imprimir_encabezado($grabar);
		
		print REPORTE " ######################################################## \n";
		
		for $i (1..$#AOH_resultado)
		{
			if($aux_branch_id_rto eq $AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO})
			{
				$subtotal_cliente_x_suc++;
			}else{
				print REPORTE "		Subtotal $AOH_resultado_Ordenado[($i-1)]{BRANCH_NAME_RTO} :  $subtotal_cliente_x_suc \n";
				print REPORTE " ######################################################## \n";
				$total_de_clientes = $total_de_clientes + $subtotal_cliente_x_suc;
				$subtotal_cliente_x_suc=1;
				$aux_branch_id_rto=$AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO};
			}
			print REPORTE " \n";
			print REPORTE " Sucursal : $AOH_resultado_Ordenado[$i]{BRANCH_ID_RTO} - $AOH_resultado_Ordenado[$i]{BRANCH_NAME_RTO}  \n";
			print REPORTE " Cliente : $AOH_resultado_Ordenado[$i]{CUSTOMER_ID_RTO} - $AOH_resultado_Ordenado[$i]{CUSTOMER_1ST_NAME_RTO} \n";
			print REPORTE " Tipo de Producto : $AOH_resultado_Ordenado[$i]{PRODUCT_TYPE_NAME_RTO}  \n";
			print REPORTE " Plan Comercial : $AOH_resultado_Ordenado[$i]{COMMERCIAL_PLAN_NAME_RTO}  \n";
			print REPORTE " Item : . $AOH_resultado_Ordenado[$i]{ITEM_NAME_RTO}  \n"; 
			print REPORTE " ######################################################## \n";
		}
		print REPORTE "		Subtotal $AOH_resultado_Ordenado[$#AOH_resultado_Ordenado]{BRANCH_NAME_RTO} :  $subtotal_cliente_x_suc \n";
		$total_de_clientes = $total_de_clientes + $subtotal_cliente_x_suc;
		
		print REPORTE " ######################################################## \n";
		print REPORTE "	#	Total de Clientes: $total_de_clientes          # \n";
		print REPORTE " ######################################################## \n";

		close(REPORTE);
		
		print "\n Se ha grabado el reporte: " . $reporte . " en el directorio: " . $dir . "\n";
		print "\n";
	}
}	
############################FIN SUBRUTINAS############################################


#Verificamos si los parametros ingresados son correctos
#=========================================
&chk_parametro_entrada;

#Inicializamos el menu de usuario para realizar la consulta
#=========================================
&ingrese_datos_consulta;
print ( "------------------------------------------------------------------------------------------------------------------------------------ \n" );
print ( "Procesando Consulta.... \n");
	
#Cargamos los Hash de Maestros
#========================
&cargar_hash_maestro;
	
#Resolvemos la consulta y la guardamos en un Hash de Resultado
#================================================
&resolver_consulta;
if($encontrado eq "N")
{
	print "\n";
	print "	No se han encontrado datos que coincidan con la consulta realizada. \n";
	print "\n";
	
}else{
	
	#Imprimimos los resultados obtenidos de la consulta
	&mostrar_resultados($grabar);
		
}
#######################FIN##################################################################


